package com.mmd.utils;

import java.util.Date;
import java.util.Enumeration;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.converters.DateTimeConverter;

public class Myutils {
	/**
	 * 使用反射，将request中提交的 form表单数据映射到实体类中
	 * 
	 * @param request
	 *            请求对象
	 * @param clazz
	 *            实体类的Class
	 * @return 映射表单数据的实体类实例
	 */
	public static <T> T convertFormDate2Bean(HttpServletRequest request, Class<T> clazz) {
		T t = getInstance(clazz);
		if (request != null) {
			//定义BeanUtils的包装类类型的转换器[可以使用匿名内部类]
//			ConvertUtils.register(new DateTimeConverter(), Date.class);
			// 获取request中提交的所有的表单控件的name属性值
			Enumeration<String> paramNames = request.getParameterNames();
			if (paramNames != null) {
				
				// 遍历每一个元素
				try {
					while (paramNames.hasMoreElements()) {
						// 取出当前遍历的元素对象:当前的表单的name属性值
						String strName = paramNames.nextElement();
						// 从request获取 当前form表单的name属性对应的val值
						String strVal = request.getParameter(strName);
						// 使用反射将表单的value值设置到与之对应的实体类属性中
						BeanUtils.setProperty(t, strName, strVal);
					}
				} catch (Exception e) {
					// form表单属性值映射到实体类中异常
					System.out.println("form表单属性值映射到实体类中异常" + e.getMessage());
					e.printStackTrace();
				}
			}
		}
		return t;
	}
	/**
	 * 简单工厂模式
	 * @param clazz 需要创建的对象
	 * @return
	 */
	public static <T> T getInstance(Class<T> clazz) {
		T t = null;
		try {
			// 反射获取该class的一个实例对象
			t = clazz.newInstance();
		} catch (Exception e) {
			// 获取实例对象异常
			System.out.println("获取实例对象异常:" + e.getMessage());
			e.printStackTrace();
		}
		return t;
	}
}
